/*
 * EManager.java
 * 0.1 31/10/2012
 *
 * Authors: José Luis Urbano Orgaz (joseluislikebetter@hotmail.com)
 *          Milagros Membrillo Jimenez
 *
 * Copyright: This file is part of E-Man.
 *   
 *   E-Man is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *  
 *   E-Man is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 *   GNU General Public License for more details.
 *  
 *   You should have received a copy of the GNU General Public License
 *   along with E-Man.  If not, see <http://www.gnu.org/licenses/>.
 */
package Logica;

import EntradaSalida.CargarArchivo;
import EntradaSalida.GuardarArchivo;
import Objetos.Cliente;
import Objetos.ConexionBD;
import Objetos.Provincia;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JTextField;

/**
 * Clase gestora del programa
 * @author Milagros Membrillo
 * @author José Luis Urbano Orgaz
 */
public class EManager {

    private Connection con;
    private Statement st;
    private ResultSet rs;
   // private String[][] listaProvincias;
    /**
     * Llama al sistema para que cierre la aplicación
     */
    public void CerrarAplicacion() {
        System.exit(0);
    }

    public  boolean ComprobarConexion(String direccion, String usuario, char[] password) {
        //Comprobamos si hay ya abierta alguna conexión con alguna base de datos, en cuyo caso la cerraremos
        String contrasenha="";
        if (con!=null)
        {
            cerrarConexion();
        }
        boolean conectada;
        if(password.length>0)
        {
         contrasenha=String.valueOf(password);
        }
        
        try {

            String url = "jdbc:mysql://";
            url=url.concat(direccion);
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            con = DriverManager.getConnection(url, usuario, contrasenha);
            PrepararSentencia();
            conectada=true;
        } catch (Exception e) {
            conectada=false;
        }
        return conectada;
    }
     
      /**
     * Ejecuta cada consulta, recibiendo el nombre de la consulta a devolver
     *
     * @param consulta
     * @throws SQLException
     */
    public void EjecutarConsulta(String consulta) {
        try {
            rs = st.executeQuery(consulta);
        } catch (SQLException ex) {
            //CAMBIAR ESTOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
        }
    }

    /**
     * Cierra la conexión con la BD
     */
    public void cerrarConexion() {
        try {
            con.close();
            System.out.println("Conexion cerrada");
        } catch (SQLException e) {
             System.out.println("Error al cerrar conexion");
        }
    }
    
    /**
     * Prepara el código java para lanzar sentencias
     *
     * @throws SQLException Lanza excepción en lugar de capturarla
     */
    public void PrepararSentencia() {
        try {
            st = con.createStatement();
        } catch (SQLException ex) {
            System.out.println("Fallo al ejecutar la sentencia");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public String[] ListarNombresProvincias(){
        String[] listaNombres={"Alava","Albacete","Alicante","Almería","Asturias","Avila","Badajoz","Baleares",
        "Barcelona","Burgos","Cáceres","Cádiz","Cantabria","Castellón","Ceuta","Ciudad Real","Córdoba",
        "Coruña, La","Cuenca","Gerona","Granada","Guadalajara","Guipuzcoa","Huelva","Huesca","Jaen",
        "León","Lérida","Lugo","Madrid","Málaga","Melilla","Murcia","Navarra","Orense","Palencia",
        "Palmas (Las)","Pontevedra","Rioja (La)","S.C.Tenerife","Salamanca","Segovia","Sevilla","Soria",
        "Tarragona","Teruel","Toledo","Valencia","Valladolid","Vizcaya","Zamora","Zaragoza"};
        
        return listaNombres;
    }
   
     public String[] ListarNombresLocalidades() {
        String[] arrayLocalidades=null;
        ArrayList<String> listaLocalidades=new ArrayList<String>();
        try {
        if(con!=null)
        {
        
            String sentencia="SELECT Poblacion FROM poblaciones ORDER BY Poblacion asc";
            EjecutarConsulta(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                listaLocalidades.add(rs.getString("Poblacion"));
            }
            arrayLocalidades=new String[listaLocalidades.size()];
            //Convertimos la lista en array para facilitar su uso
            listaLocalidades.toArray(arrayLocalidades);
        }
        } catch (SQLException ex) {
            System.out.println("Se ha producido un fallo al listar las localidades");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return arrayLocalidades;
    }
    
        public ArrayList<Provincia> ListarProvincias() {
        ArrayList<Provincia> listaProvincias=new ArrayList<>();
        if(con!=null)
        {
        Provincia provincia;
        try {
            String sentencia="SELECT * FROM provincias";
            EjecutarConsulta(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                provincia=new Provincia(rs.getInt("CodigoProvincia"), rs.getString("Provincia"));
                listaProvincias.add(provincia);
            }
            
        } catch (SQLException ex) {
            System.out.println("Se ha producido un fallo al listar las provincias");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        return listaProvincias;
    }

    public String getCodigoProvincia(String provincia) { 
        String codProvincia="";
        try {
            String sentencia="SELECT CodigoProvincia FROM provincias WHERE Provincia='"+provincia+"';";
            EjecutarConsulta(sentencia);
            rs.first();
            codProvincia=rs.getString(1);
        }catch(SQLException ex) {
            System.out.println("Fallo al intentar obtener el código de la provincia");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codProvincia;
    }
    
    public String getCodigoLocalidad(String localidad) {
        String codPoblacion="";
        try {
            String sentencia="SELECT CodigoPoblacion FROM poblaciones WHERE Poblacion='"+localidad+"';";
            rs = st.executeQuery(sentencia);
            rs.first();
            codPoblacion=rs.getString(1);
        }catch(SQLException ex) {
            System.out.println("Fallo al intentar obtener el código de la localidad");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codPoblacion;
    }
    
    public String getCodigoCalle(String localidad, String calle) {
        String codCalle="";
        try {
            String sentencia="SELECT idCalle FROM callespoblaciones WHERE (CodPoblacion="+localidad+") AND (Nombre='"+calle+"');";
            rs = st.executeQuery(sentencia);
            rs.first();
            codCalle=rs.getString(1);
        }catch(SQLException ex) {
            System.out.println("Fallo al intentar obtener el código de la calle");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codCalle;
    }
    
    /**
     * Permite obtener el nombre de una provincia dado su id
     * @param provincia ID de la provincia
     * @return Nombre comprensible para el usuario
     */
    public String getNombreProvincia(String codProv) { 
        String provincia="";
        try {
            String sentencia="SELECT Provincia FROM provincias WHERE CodigoProvincia="+codProv+";";
            EjecutarConsulta(sentencia);
            rs.first();
            provincia=rs.getString(1);
        }catch(SQLException ex) {
            System.out.println("Fallo al intentar obtener el nombre de la provincia");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return provincia;
    }
    
    /**
     * Permite obtener el nombre de una localidad dado su id
     * @param localidad ID de la localidad
     * @return Nombre comprensible para el usuario
     */
    public String getNombreLocalidad(String codPoblacion) {
        String localidad="";
        try {
            String sentencia="SELECT Poblacion FROM poblaciones WHERE CodigoPoblacion="+codPoblacion+";";
            rs = st.executeQuery(sentencia);
            rs.first();
            localidad=rs.getString(1);
        }catch(SQLException ex) {
            System.out.println("Fallo al intentar obtener el nombre de la localidad");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return localidad;
    }
    
    public String getNombreCalle(String idCalle) {
        String calle="";
        try {
            String sentencia="SELECT Nombre FROM callespoblaciones WHERE idCalle="+idCalle+";";
            rs = st.executeQuery(sentencia);
            rs.first();
            calle=rs.getString(1);
        }catch(SQLException ex) {
            System.out.println("Fallo al intentar obtener el nombre de la calle");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return calle;
    }
    
    /**
     * Permite obtener todas las localidades dada una provincia
     * @param provincia Provincia de la que se quieren obtener las localidades
     * @return Lista de Strings con las localidades
     */
    public ArrayList<String> getLocalidades(String provincia) {
        ArrayList<String> listaLocalidades=new ArrayList<String>();
        boolean vacio=true;
        if(con!=null)
        {
        String codProvincia=getCodigoProvincia(provincia);
        try {
            String sentencia="SELECT Poblacion FROM poblaciones WHERE CodigoProvincia="+codProvincia+";";
            EjecutarConsulta(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                listaLocalidades.add(rs.getString(1));
                vacio=false;
            }
        } catch (SQLException ex) {
            System.out.println("Fallo al intentar obtener las localidades");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (vacio)
        {
            listaLocalidades.add("<-- Sin localidades -->");
        }
        }
        return listaLocalidades;
    }

    public ArrayList<String> getCalles(String localidad) {
        ArrayList<String> listaCalles=new ArrayList<String>();
        if(con!=null)
        {
        String codLocalidad=getCodigoLocalidad(localidad);
        try {
            String sentencia="SELECT Nombre FROM callespoblaciones WHERE CodPoblacion="+codLocalidad+";";
            rs = st.executeQuery(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                listaCalles.add(rs.getString(1));
            }   
        } catch (SQLException ex) {
            System.out.println("Fallo al intentar obtener las calles");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        return listaCalles;
    }
    
    /**
     * Permite obtener los clientes de una provincia determinada
     * @param codProvincia Código de la provincia
     * @return Lista de clientes
     */
        public ArrayList<String> getClientesfroProvincia(String codProvincia) {
        ArrayList<String> listaClientes=new ArrayList<>();
        if(con!=null)
        {
        try {
            String sentencia="SELECT Codigo FROM clientes WHERE CodigoProvincia="+codProvincia+";";
            rs = st.executeQuery(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                listaClientes.add(rs.getString(1));
            }   
        } catch (SQLException ex) {
            System.out.println("Fallo al intentar obtener las mediciones");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        return listaClientes;
    }
        
    /**
     * Permite obtener las mediciones de un cliente
     * @param codCliente Código del cliente
     * @return Lista de mediciones
     */
        public ArrayList<String> getMediciones(String codCliente) {
        ArrayList<String> listaMediciones=new ArrayList<>();
        if(con!=null)
        {
        try {
            String sentencia="SELECT idMedicion FROM mediciones WHERE Cliente="+codCliente+";";
            rs = st.executeQuery(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                listaMediciones.add(rs.getString(1));
            }   
        } catch (SQLException ex) {
            System.out.println("Fallo al intentar obtener las mediciones");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        }
        return listaMediciones;
    }
    
    public ArrayList<Cliente> BuscarCliente(String nombre,String apellido1,String apellido2,String provincia,String localidad,String calle,String numero,String piso,String metros)
    {
        String sentencia="SELECT * FROM clientes";
        String addRequisitodeBusqueda="";
        boolean insertarAND=false;
        Cliente cliente;
        ArrayList<Cliente> listaClientes=new ArrayList<Cliente>();
        //Comprobamos si se ha especificado alguna variable, en caso contrario, no se añadirá el WHERE al SQL
        if((!nombre.equals(""))||(!apellido1.equals(""))||(!apellido2.equals(""))||(!provincia.equals(""))||(!localidad.equals(""))||(!calle.equals(""))||(!numero.equals(""))||(!piso.equals(""))||(!metros.equals("")))
        {
            sentencia=sentencia.concat(" WHERE");
            //Comprobamos uno a uno si se han especificado cada variable
        if (!nombre.equals(""))
        {
            addRequisitodeBusqueda=" (Nombre='".concat(nombre);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat("')");
            insertarAND=true;
        }
        if (!apellido1.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (Apellido='".concat(apellido1);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat("')");
            insertarAND=true;
        }
        if (!apellido2.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (Apellido2='".concat(apellido2);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat("')");
            insertarAND=true;
        }
        if (!calle.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (Calle=".concat(calle);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat(")");
            insertarAND=true;
        }
        if (!numero.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (Numero=".concat(numero);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat(")");
            insertarAND=true;
        }
        if (!piso.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (Piso=".concat(piso);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat(")");
            insertarAND=true;
        }
        if (!metros.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (Metros=".concat(metros);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat(")");
            insertarAND=true;
        }
        if (!provincia.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (CodigoProvincia=".concat(provincia);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat(")");
            insertarAND=true;
        }
        if (!localidad.equals(""))
        {
            if (insertarAND==true)
            {
                sentencia=sentencia.concat(" AND");
            }
            addRequisitodeBusqueda=" (CodigoPoblacion='".concat(localidad);
            sentencia=(sentencia.concat(addRequisitodeBusqueda)).concat("')");
        }
        }
        sentencia=sentencia.concat(";");
        try {
            rs = st.executeQuery(sentencia);
            rs.beforeFirst();
            while (rs.next())
            {
                cliente=new Cliente(rs.getString("Nombre"),rs.getString("Apellido"),rs.getString("Apellido2"), rs.getInt("CodigoProvincia"), rs.getString("CodigoPoblacion"), rs.getInt("Calle"), rs.getInt("Numero"), rs.getInt("Piso"), rs.getInt("Metros")); //Falta introducir los parametros recibidos
                listaClientes.add(cliente);
            }   
        } catch (SQLException ex) {
            System.out.println("Fallo al intentar obtener la lista de clientes que cumplan con los parámetros marcados");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return listaClientes;
    }
    
    public void MostrarLista(ArrayList<Cliente> lista)
    {
        Iterator it=lista.iterator();
        while(it.hasNext())
        {
            Cliente cli=(Cliente)it.next();
            System.out.println(cli);
        }
    }

    /**
     * Permite añadir una nueva provincia
     * @param nombreProvincia Nombre de la provincia a insertar
     * @return true si ha sido insertada correctamente, y false si no.
     */
    public boolean AddProvincia(String nombreProvincia) {
        boolean insertado=true; //Permite saber si se ha insertado o no.
        try{
            String sentencia="INSERT INTO provincias VALUES (null,'"+nombreProvincia+"');";
            //Insertamos la nueva provincia
            st.executeUpdate(sentencia);
        //Si se produce un error, se cambia el estado de insertado
        }catch(Exception ex){ 
            insertado=false;
        }
        return insertado;
    }
    
    /**
     * Permite añadir una nueva poblacion
     * @param nombre Nombre de la población
     * @param codProvincia Código de la provincia en la que se encuentra
     * @param numHabitantes Número de habitantes de la población
     * @return true si ha sido insertada correctamente, y false si no.
     */
    public boolean AddPoblacion(String nombre, String codProvincia, String numHabitantes) {
        boolean insertado=true; //Permite saber si se ha insertado o no.
        int posicion=1;
        try{
            //En primer lugar, hallaremos el código de la última población añadida perteneciente
            //a la provincia determinada
            String sentencia = "SELECT CodigoPoblacion FROM poblaciones WHERE CodigoProvincia="+codProvincia+" ORDER BY CodigoPoblacion DESC";
            rs = st.executeQuery(sentencia);
            rs.beforeFirst();
            if(rs.next()) //Si existe alguna población, el código de población será el siguiente
            {
                posicion+=rs.getInt(1);
            }else{ //Si no existe ninguna población, es necesario crear la primera con su formato
                posicion+=Integer.parseInt(codProvincia)*1000;
            }
            //Obtenida el código de población, la insertaremos en la BD
            sentencia="INSERT INTO poblaciones VALUES ('"+posicion+"','"+nombre+"','"+numHabitantes+"','"+codProvincia+"');";
            //Insertamos la nueva población
            st.executeUpdate(sentencia);
        //Si se produce un error, se cambia el estado de insertado
        }catch(Exception ex){ 
            insertado=false;
        }
        return insertado;
    }
    
    /**
     * Permite añadir una calle a la BD
     * @param nombre Nombre de la calle
     * @param codLocalidad Código de la localidad donde se encuentra la calle
     * @param cp Código Postal de la calle
     * @return true si ha sido insertada correctamente, y false si no.
     */
    public boolean AddCalle(String nombre, String codLocalidad, String cp) {
        boolean insertado=true; //Permite saber si se ha insertado o no.
        try{
            String sentencia="INSERT INTO callespoblaciones VALUES (null,'"+codLocalidad+"','"+nombre+"',"+cp+");";
            //Insertamos la nueva calle
            st.executeUpdate(sentencia);
        //Si se produce un error, se cambia el estado de insertado
        }catch(Exception ex){ 
            insertado=false;
        }
        return insertado;
    }
    
    /**
     * Permite añadir un nuevo cliente a la base de datos
     * @param nombre Nombre del cliente
     * @param apellido Primer apellido del cliente
     * @param apellido2 Segundo apellido del cliente
     * @param provincia Provincia del cliente
     * @param localidad Población del cliente
     * @param calle Calle donde vive el cliente
     * @param numero Numero de la calle donde vive el cliente
     * @param piso Piso del cliente
     * @param metros Metros de la calle
     */
    public void AddCliente(String nombre, String apellido,String apellido2, String provincia,
    String localidad, String calle, String numero, String piso,String metros)
    {
        try {
            String codProvincia=getCodigoProvincia(provincia);
            String codLocalidad=getCodigoLocalidad(localidad);
            String codCalle=getCodigoCalle(codLocalidad, calle);
            String sentencia="INSERT INTO clientes VALUES (null,'"+nombre+"','"+apellido+
                             "','"+apellido2+"',"+codCalle+","+numero+
                             ","+piso+","+metros+","+codLocalidad+","+codProvincia+");";
            //Insertamos el cliente ya definido
            st.executeUpdate(sentencia);
        } catch (SQLException ex) {
            System.out.println("Fallo al añadir un nuevo cliente");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    
    /**
     * Permite modificar los datos de una provincia
     * @param codProv Código de la provincia a modificar
     * @param idProvincia Nuevo código de la provincia
     * @param nombreProvincia Nuevo nombre de la provincia
     * @return true si ha sido insertada correctamente, y false si no.
     */
    public boolean ModificarProvincia(String codProv, String idProvincia, String nombreProvincia) {
        boolean modificado=true; //Permite saber si se ha modificado o no.
        //En primer lugar modificaremos la tabla provincia
        try{
            String sentencia="UPDATE provincias SET CodigoProvincia='"+idProvincia+"',Provincia='"+nombreProvincia+"' WHERE CodigoProvincia='"+codProv+"';";
            //Modificamos la provincia
            st.executeUpdate(sentencia);
            //seguidamente deberemos actualizar las poblaciones que dependan de ella
            sentencia="UPDATE poblaciones SET CodigoProvincia='"+idProvincia+"' WHERE CodigoProvincia='"+codProv+"';";
            st.executeUpdate(sentencia);
            //por último, procedemos a modificar el código de provincia de los clientes afectados
            sentencia="UPDATE clientes SET CodigoProvincia='"+idProvincia+"' WHERE CodigoProvincia='"+codProv+"';";
            st.executeUpdate(sentencia);
        //Si se produce un error, se cambia el estado de insertado
        }catch(Exception ex){ 
            modificado=false;
        }
        return modificado;
    }
    
    /**
     * Permite modificar los datos de una localidad
     * @param codLoc Código actual de la localidad a modificar
     * @param codProvdelaLocalidad Código de la nueva provincia a la que pertenece
     * @param codigoLocalidad Nuevo código identificador de la localidad
     * @param nombreLocalidad Nuevo nombre de la localidad
     * @param numHabitantesLocalidad Nuevo número de habitantes de la localidad
     * @return true si ha sido insertada correctamente, y false si no.
     */
     public boolean ModificarPoblacion(String codLoc, String codProvdelaLocalidad, String codigoLocalidad, 
                                      String nombreLocalidad, String numHabitantesLocalidad)
     {
        boolean modificado=true; //Permite saber si se ha modificado o no.
        //En primer lugar modificaremos la tabla poblacion
        try{
            String sentencia="UPDATE poblaciones SET CodigoPoblacion='"+codigoLocalidad+"',Poblacion='"+nombreLocalidad+"',Habitantes='"+
                             numHabitantesLocalidad+"',CodigoProvincia='"+codProvdelaLocalidad+"' WHERE CodigoPoblacion='"+codLoc+"';";
            //Modificamos la población
            st.executeUpdate(sentencia);
            //seguidamente deberemos actualizar las calles que dependan de ella
            sentencia="UPDATE callespoblaciones SET CodPoblacion='"+codigoLocalidad+"' WHERE CodPoblacion='"+codLoc+"';";
            st.executeUpdate(sentencia);
            //por último, procedemos a modificar el código de población de los clientes afectados
            sentencia="UPDATE clientes SET CodigoPoblacion='"+codigoLocalidad+"',CodigoProvincia='"+codProvdelaLocalidad+"' WHERE CodigoPoblacion='"+codLoc+"';";
            st.executeUpdate(sentencia);
        //Si se produce un error, se cambia el estado de insertado
        }catch(Exception ex){ 
            modificado=false;
        }
        return modificado;
     }    
    
     /**
      * Permite modificar una calle a partir de su código
      * @param codCalle Código de la calle a modificar
      * @param codNuevaLocalidad Nueva localidad en la que se encuentra
      * @param nuevoCodigo Nuevo código de la calle
      * @param nuevoNombre Nuevo nombre de la calle
      * @param nuevoCP Nuevo CP de la calle
      * @return true si ha sido insertada correctamente, y false si no.
      */
      public boolean ModificarCalle(String codCalle, String codNuevaLocalidad, String nuevoCodigo, String nuevoNombre, String nuevoCP) {
         boolean modificado=true; //Permite saber si se ha modificado o no.
         String codNuevaProvincia;
        //En primer deberemos hallar el código de provincia de la calle donde se va a trasladar
         String sentencia="SELECT CodigoProvincia FROM poblaciones WHERE CodigoPoblacion="+codNuevaLocalidad+";";
         try{
         rs = st.executeQuery(sentencia);
            rs.first();
            codNuevaProvincia=rs.getString(1);
            sentencia="UPDATE callespoblaciones SET idCalle='"+nuevoCodigo+"',CodPoblacion='"+codNuevaLocalidad+"',Nombre='"+
                             nuevoNombre+"',CodPostal='"+nuevoCP+"' WHERE idCalle='"+codCalle+"';";
            //Modificamos la calle
            st.executeUpdate(sentencia);
            //por último, procedemos a modificar la calle,el código de poblacióny la provincia de los clientes afectados
            sentencia="UPDATE clientes SET Calle='"+nuevoCodigo+"',CodigoPoblacion='"+codNuevaLocalidad+"',CodigoProvincia='"+codNuevaProvincia+"' WHERE Calle='"+codCalle+"';";
            st.executeUpdate(sentencia);
        //Si se produce un error, se cambia el estado de insertado
        }catch(Exception ex){ 
            modificado=false;
        }
        return modificado;
    }
      
    /**
     * Permite modificar los datos de un cliente dado
     * @param cl Cliente del que se van a modificar los datos
     * @param nombre Nuevo nombre del cliente
     * @param apellido Nuevo apellido del cliente
     * @param apellido2 Nuevo segundo del cliente
     * @param provincia Nueva provincia del cliente
     * @param localidad Nueva localidad del cliente
     * @param calle Nueva calle del cliente
     * @param numero Nuevo número
     * @param piso Nuevo piso
     * @param metros Nuevo metros
     */
    public void ModificarDatosCliente(Cliente cl, String nombre, String apellido,
    String apellido2, String provincia, String localidad, String calle, String numero, String piso,
    String metros) 
    {        
        try {
            String codProvincia=getCodigoProvincia(provincia);
            String codLocalidad=getCodigoLocalidad(localidad);
            String codCalle=getCodigoCalle(codLocalidad, calle);
            String sentencia="UPDATE clientes SET Nombre='"+nombre+"', Apellido='"+apellido+
                             "', Apellido2='"+apellido2+"', Calle="+codCalle+", Numero="+numero+
                             ", Piso="+piso+", Metros="+metros+", CodigoPoblacion="+codLocalidad+
                             ", CodigoProvincia="+codProvincia+
                             " WHERE (Nombre='"+cl.getNombre()+"') AND (Apellido='"+cl.getApellido1()+
                             "') AND (Apellido2='"+cl.getApellido2()+"') AND (Calle="+String.valueOf(cl.getCalle())+
                             ") AND (Numero="+String.valueOf(cl.getNumero())+") AND (Piso="+String.valueOf(cl.getPiso())+
                             ") AND (Metros="+String.valueOf(cl.getMetros())+") AND (CodigoPoblacion="+String.valueOf(cl.getLocalidad())+
                             ") AND (CodigoProvincia="+String.valueOf(cl.getProvincia())+");";
            st.executeUpdate(sentencia);
        } catch (SQLException ex) {
            System.out.println("Fallo al modificar los datos del cliente");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    /**
     * Borra una provincia dado su id
     * @param codProvinciaSeleccionada Código de la provincia a borrar
     * @param borrarMediciones True si se quieren borrar las mediciones en la provincia y false si no
     * @return true si ha sido insertada correctamente, y false si no.
     */
    public boolean EliminarProvincia(String provinciaSeleccionada, boolean borrarMediciones) {
        String codProvinciaSeleccionada=getCodigoProvincia(provinciaSeleccionada);
        boolean procesoCorrecto=true;
        try {
            if (borrarMediciones)
            {
                    String sentencia="DELETE FROM mediciones WHERE Cliente IN (SELECT Codigo FROM clientes WHERE CodigoProvincia='"+codProvinciaSeleccionada+"');";
                    st.executeUpdate(sentencia);         
            }
            //Se continua borrando los clientes que se encuentren en la provincia
            String sentencia="DELETE FROM clientes WHERE CodigoProvincia='"+codProvinciaSeleccionada+"';";
            st.executeUpdate(sentencia);
            sentencia="DELETE FROM callespoblaciones WHERE CodPoblacion IN (SELECT CodigoPoblacion FROM poblaciones WHERE CodigoProvincia='"+codProvinciaSeleccionada+"');";
            st.executeUpdate(sentencia);     
             sentencia="DELETE FROM poblaciones WHERE CodigoProvincia='"+codProvinciaSeleccionada+"';";
             st.executeUpdate(sentencia);
             sentencia="DELETE FROM provincias WHERE CodigoProvincia='"+codProvinciaSeleccionada+"';";
             st.executeUpdate(sentencia);
            
            
            //Se termina borrando la provincia de la tabla provincias
           
        }catch(Exception ex)
        {
            System.out.println("Fallo al eliminar provincia");
            procesoCorrecto=false;
        }
        return procesoCorrecto;
    }
        
     public boolean EliminarPoblacion(String poblacionSeleccionada, boolean borrarMediciones) {
         boolean procesoCorrecto=true;
         String sentencia;
         String codPoblacion=getCodigoLocalidad(poblacionSeleccionada);
         try{
         if (borrarMediciones)
            {
                 sentencia="DELETE FROM mediciones WHERE Cliente IN (SELECT Codigo FROM clientes WHERE CodigoPoblacion="+codPoblacion+");";
                 st.executeUpdate(sentencia);     
            }
    
         sentencia="DELETE FROM clientes WHERE CodigoPoblacion='"+codPoblacion+"';";
          st.executeUpdate(sentencia);
         sentencia="DELETE FROM callespoblaciones WHERE CodPoblacion='"+codPoblacion+"';";
          st.executeUpdate(sentencia);  
          sentencia="DELETE FROM poblaciones WHERE CodigoPoblacion='"+codPoblacion+"';";
          st.executeUpdate(sentencia); 
            }catch(Exception ex){
            System.out.println("Fallo al eliminar la población");
            procesoCorrecto=false;
            }
         return procesoCorrecto;
     }
     
     
    public boolean EliminarCalle(String codLocalidad,String calleSeleccionada, boolean borrarMediciones) {
        boolean procesoCorrecto=true;
         String sentencia;
         String codCalle=getCodigoCalle(codLocalidad,calleSeleccionada);
         try{
         if (borrarMediciones)
            {
                 sentencia="DELETE FROM mediciones WHERE Cliente IN (SELECT Codigo FROM clientes WHERE Calle="+codCalle+");";
                 st.executeUpdate(sentencia);     
            }
    
         sentencia="DELETE FROM clientes WHERE Calle='"+codCalle+"';";
          st.executeUpdate(sentencia);
         sentencia="DELETE FROM callespoblaciones WHERE idCalle='"+codCalle+"';";
          st.executeUpdate(sentencia);  
            }catch(Exception ex){
            System.out.println("Fallo al eliminar la población");
            procesoCorrecto=false;
            }
         return procesoCorrecto;
    }
    
    /**
     * Permite borrar un cliente
     * @param cl Cliente a borrar
     */
    public void BorrarCliente(Cliente cl)
    {
        try {
            String sentencia="DELETE FROM clientes WHERE (Nombre='"+cl.getNombre()+"') AND (Apellido='"+cl.getApellido1()+
                             "') AND (Apellido2='"+cl.getApellido2()+"') AND (Calle="+String.valueOf(cl.getCalle())+
                             ") AND (Numero="+String.valueOf(cl.getNumero())+") AND (Piso="+String.valueOf(cl.getPiso())+
                             ") AND (Metros="+String.valueOf(cl.getMetros())+") AND (CodigoPoblacion="+String.valueOf(cl.getLocalidad())+
                             ") AND (CodigoProvincia="+String.valueOf(cl.getProvincia())+");";
            st.executeUpdate(sentencia);
        } catch (SQLException ex) {
            System.out.println("Fallo al borrar cliente");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    

    public void GuardarDatosConexion(boolean Bdireccion, String direccion, boolean Busuario,
                String usuario, boolean Bpassword, char[] password) {
        ConexionBD guardarConexionBD=new ConexionBD();
        if (Bdireccion)
        {
            guardarConexionBD.setDireccion(direccion);
        }
        if(Busuario)
        {
            guardarConexionBD.setUsuario(usuario);
        }
        if (Bpassword)
        {
            guardarConexionBD.setPassword(password);
        }
        GuardarArchivo guardar= new GuardarArchivo();
        guardar.Conexion(guardarConexionBD);
    }
    
    public String[] CargarDatosConexion()
    {
        CargarArchivo cargar=new CargarArchivo();
        ConexionBD cargarConexionBD=cargar.Conexion();
        String[] datos=new String[3];
        if (cargarConexionBD.getDireccion()!=null)
        {
            datos[0]=cargarConexionBD.getDireccion();
        }
        else
        {
            datos[0]=null;
        }
        if (cargarConexionBD.getUsuario()!=null)
        {
            datos[1]=cargarConexionBD.getUsuario();
        }
        else
        {
            datos[1]=null;
        }
        if (cargarConexionBD.getPassword()!=null)
        {
            String datosAux="";
            char[] arrayPassword=cargarConexionBD.getPassword();
            for(int i=0;i<arrayPassword.length;i++)
            {
               datosAux=datosAux.concat(String.valueOf(arrayPassword[i])); 
            }
            datos[2]=datosAux;
            
        }
        else
        {
            datos[2]=null;
        }
        
    return datos;
    }

    public String getInformeAnho(String anho, Cliente cl) {
        String codCliente;
        DecimalFormat dec = new DecimalFormat("####.##");
        double media = 0;
        int numMedidas = 0;
        String sentencia = "SELECT Codigo FROM clientes WHERE (Nombre='"+cl.getNombre()+"') AND (Apellido='"+cl.getApellido1()+
                             "') AND (Apellido2='"+cl.getApellido2()+"') AND (Calle="+String.valueOf(cl.getCalle())+
                             ") AND (Numero="+String.valueOf(cl.getNumero())+") AND (Piso="+String.valueOf(cl.getPiso())+
                             ") AND (Metros="+String.valueOf(cl.getMetros())+") AND (CodigoPoblacion="+String.valueOf(cl.getLocalidad())+
                             ") AND (CodigoProvincia="+String.valueOf(cl.getProvincia())+");";
        try {
            rs = st.executeQuery(sentencia);
            rs.first();
            codCliente=rs.getString(1);
            sentencia="SELECT AVG(KW) FROM mediciones WHERE (Cliente='"+codCliente+"')AND(year(FechaHora)="+anho+");";
            rs = st.executeQuery(sentencia);
            media=rs.getDouble(1);
        } catch (SQLException ex) {
            System.out.println("Fallo al obtener la media anual");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dec.format(media);
    }
    
    public String getInformeMes(String anho, String mes, Cliente cl) {
        String codCliente;
        DecimalFormat dec = new DecimalFormat("###.##");
        double acumulado=0;
        String sentencia="SELECT Codigo FROM clientes WHERE (Nombre='"+cl.getNombre()+"') AND (Apellido='"+cl.getApellido1()+
                             "') AND (Apellido2='"+cl.getApellido2()+"') AND (Calle="+String.valueOf(cl.getCalle())+
                             ") AND (Numero="+String.valueOf(cl.getNumero())+") AND (Piso="+String.valueOf(cl.getPiso())+
                             ") AND (Metros="+String.valueOf(cl.getMetros())+") AND (CodigoPoblacion="+String.valueOf(cl.getLocalidad())+
                             ") AND (CodigoProvincia="+String.valueOf(cl.getProvincia())+");";
        try {
            rs = st.executeQuery(sentencia);
            rs.first();
            codCliente=rs.getString(1);
            sentencia="SELECT SUM(KW) FROM mediciones WHERE (Cliente='"+codCliente+"')AND(year(FechaHora)="+anho+")AND(month(FechaHora)="+mes+");";
            rs = st.executeQuery(sentencia);
            rs.first();
            acumulado=rs.getDouble(1);
        } catch (SQLException ex) {
            System.out.println("Fallo al obtener la media anual");
            Logger.getLogger(EManager.class.getName()).log(Level.SEVERE, null, ex);
        }
        return dec.format(acumulado);
    }

    /**
     * 
     * @param tipoInforme Valor numérico identificador del tipo de informe que se va a realizar
     * @param fecha Fecha al que está restringido el informe
     * @param lugar Lugar al que está restringido el informe
     * @return Array de Strings con el valor medio y el acumulado resultado del informe
     */
    public String[] getDatosInforme(int tipoInforme, String fecha, String lugar) {
        String sentencia;
        String s;
        float suma=0;
        int cantidad=0;
        ArrayList<String> lista=new ArrayList<String>();
        ResultSet rs2;
        DecimalFormat dec = new DecimalFormat("###.##");
        String[] resultado=new String[2];
        if((tipoInforme%2)==0)
        {
            sentencia="SELECT cl.Codigo FROM clientes cl INNER JOIN poblaciones po ON cl.CodigoPoblacion = po.CodigoPoblacion WHERE po.Poblacion='"+lugar+"'";
        }
        else
        {
            sentencia = "SELECT cl.Codigo FROM clientes cl NATURAL JOIN provincias pr WHERE pr.Provincia='" + lugar + "'";
        }
        
        if(tipoInforme<2)
        {
            try {
                    s = "SELECT SUM(KW),COUNT(KW) FROM mediciones WHERE (month(FechaHora)=" + fecha + ")AND(Cliente IN (" + sentencia + "));";
                    System.out.println(s);
                    rs = st.executeQuery(s);
                    rs.first();
                    suma = rs.getFloat(1);
                    cantidad=rs.getInt(2);
            } catch (Exception ex) {
                System.out.println("Fallo al obtener los datos del informe");
                ex.printStackTrace();
            }
        } else {
            
            try {
                    s = "SELECT SUM(KW),COUNT(KW) FROM mediciones WHERE (year(FechaHora)=" + fecha + ")AND(Cliente IN (" + sentencia + "));";
                    System.out.println(s);
                    rs = st.executeQuery(s);
                    rs.first();
                    suma = rs.getFloat(1);
                    cantidad=rs.getInt(2);
            } catch (Exception ex) {
                System.out.println("Fallo al obtener los datos del informe");
                ex.printStackTrace();
            }
        }
        if (suma==0)
        {
            resultado[0]="0";
            resultado[1]="0";
        }
        else
        {
        resultado[0]=String.valueOf(dec.format(suma/cantidad));
        resultado[1]=String.valueOf(dec.format(suma));
        }
        return resultado;
    }

public boolean isConectado()
{
    boolean conectado=false;
    if(con!=null)
    {
        conectado=true;
    }
    return conectado;
}
      
}
